#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include<QDesktopServices>
#include<QProcess>
#include<QFileDialog>
#include<QMessageBox>

//聊天界面

//创建目录接口
void createDir(const QString &path);
void openVideoFile(const QString &videoFilePath);



MainWindow::MainWindow(User &user,QTcpSocket *socket,QString &friendname,QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , user(user)
    , socket(socket)
    ,friendname(friendname)
{
    ui->setupUi(this);
    mainpath = QDir::currentPath()+"/"+user.getUsername();
    QString firendmainpath=QDir::currentPath()+"/"+friendname;
    text_path = mainpath+"/text";
    video_path = mainpath+"/video";
    audio_path = mainpath+"/audio";
    image_path= mainpath+"/image";
    file_path = mainpath+"/file";

    ui->textBrowser_mingzi->append(friendname);

    QString text_path1 = firendmainpath+"/text";
    QString video_path1 = firendmainpath+"/video";
    QString audio_path1 = firendmainpath+"/audio";
    QString image_path1= firendmainpath+"/image";
    QString file_path1 = firendmainpath+"/file";

    textfile=text_path+"/"+user.getUsername()+"And"+friendname+".txt";
    //创建目录
    createDir(text_path);
    createDir(video_path);
    createDir(audio_path);
    createDir(image_path);
    createDir(file_path);

    createDir(text_path1);
    createDir(video_path1);
    createDir(audio_path1);
    createDir(image_path1);
    createDir(file_path1);
    //使用时请加上+"/"+

    // 连接anchorClicked信号
    connect(ui->textBrowser_display_text, &QTextBrowser::anchorClicked, this, &MainWindow::onAnchorClicked);

    ui->textBrowser_display_text->clear();
    ui->textBrowser_display_text->setOpenExternalLinks(true);
    qDebug()<<"textfile="<<textfile;

    QFile file(textfile);

    // 判断文件是否存在
    if (!file.exists()) {
        qDebug() <<"聊天记录文件不存在，开始创建";
        // 如果文件不存在，尝试创建文件
        if (file.open(QIODevice::WriteOnly)) {
            file.close();
        } else {
            // 文件无法打开 
        }
    } else {
        // 文件已存在
    }

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << "无法打开文件进行读取：" << textfile;
    }
    QString html;

    QTextStream in(&file);
    while (!in.atEnd()) {  // 判断是否到达文件结尾
        QString line = in.readLine();  // 按行读取
        QStringList lines = line.split(":");

        if(lines.size() >= 3){
            qDebug() << lines[0] << lines[1] << lines[2];
            if(lines[0] == "text"){
                html += QString("<p><strong>%1:</strong> %2</p>").arg(lines[1], lines[2]);
            } else if(lines[0] == "video"){
                // 改成显示为点击链接
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], video_path, lines[2],lines[2]);
            } else if(lines[0] == "audio"){
                // 改成显示为点击链接
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], audio_path, lines[2],lines[2]);
            } else if(lines[0] == "image"){
                html += QString("<p><strong>%1:</strong><br><img src='%2' style='width: 50px; height: 50px;' /></p>").arg(lines[1], image_path + "/" + lines[2]);
            } else if(lines[0] == "file"){
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], file_path ,lines[2],lines[2]);
            } else {
                qDebug() << "未知类型：" << lines[0] << lines[1] << lines[2];
            }
        }


    }
    qDebug()<<html;
    ui->textBrowser_display_text->setHtml(html);
    file.close();


    qDebug()<<"当前目录"<<QDir::currentPath();
}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::onAnchorClicked(const QUrl &url)
{
    // 检查链接是否是file://协议
    qDebug()<<"捕捉到点击事件";
    if (url.scheme() == "file") {
        // 获取本地文件路径
        QString videoFilePath = url.toLocalFile();
        openVideoFile(videoFilePath);  // 调用打开视频文件的函数
    }
}


void openVideoFile(const QString &videoFilePath) {
    // 移除 file:// 前缀并转换为正确的路径格式
    QString localFilePath = videoFilePath;

    // 处理 file:// 协议前缀
    if (localFilePath.startsWith("file://")) {
        localFilePath = localFilePath.mid(7); // 去掉 file://
    }

    // 替换双反斜杠为单反斜杠（防止路径格式错误）
    localFilePath.replace("\\\\", "\\"); // 将 \\ 替换为 \

    // 打印确认路径
    qDebug() << "Opening video file: " << localFilePath;

    // 替换 //c/ 为 C:\，使其符合 Windows 路径格式
    localFilePath.replace("//c/", "C:/");

    // 使用 QProcess 启动默认视频播放器
    QProcess::startDetached("cmd", QStringList() << "/c" << "start" << localFilePath);
}








void createDir(const QString &path){

    QDir dir;
    if (!dir.exists(path)) {
        if (dir.mkpath(path)) {
            qDebug() << "目录创建成功：" << path;
        } else {
            qWarning() << "目录创建失败：" << path;
        }
    } else {
        qDebug() << "目录已存在：" << path;
    }
}

void MainWindow::on_pushButton_shuaxin_clicked()
{
    ui->textBrowser_display_text->clear();
    ui->textBrowser_display_text->setOpenExternalLinks(true);
    QString filename=text_path+"/"+user.getUsername()+"And"+friendname+".txt";
    qDebug()<<"filename="<<filename;

    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << "无法打开文件进行读取：" << filename;
        return;
    }
    QString html;

    QTextStream in(&file);
    while (!in.atEnd()) {  // 判断是否到达文件结尾
        QString line = in.readLine();  // 按行读取
        QStringList lines = line.split(":");

        if(lines.size() >= 3){
            qDebug() << lines[0] << lines[1] << lines[2];
            if(lines[0] == "text"){
                html += QString("<p><strong>%1:</strong> %2</p>").arg(lines[1], lines[2]);
            } else if(lines[0] == "video"){
                // 改成显示为点击链接
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], video_path, lines[2],lines[2]);
            } else if(lines[0] == "audio"){
                // 改成显示为点击链接
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], audio_path, lines[2],lines[2]);
            } else if(lines[0] == "image"){
                html += QString("<p><strong>%1:</strong><br><img src='%2' style='width: 50px; height: 50px;' /></p>").arg(lines[1], image_path + "/" + lines[2]);
            } else if(lines[0] == "file"){
                html += QString("<p><strong>%1:</strong><br><a href='file://%2/%3'>%4</a></p>").arg(lines[1], file_path ,lines[2],lines[2]);
            } else {
                qDebug() << "未知类型：" << lines[0] << lines[1] << lines[2];
            }
        }


    }
    qDebug()<<html;
    ui->textBrowser_display_text->setHtml(html);
    file.close();
}

//发送文本按钮
void MainWindow::on_pushButton_send_text_clicked()
{
    QString text=ui->textEdit_in_text->toPlainText();
    ui->textEdit_in_text->clear();
    QString data="\ntext:"+user.getUsername()+":"+text;
    QString friend_textfile=QDir::currentPath()+"/"+friendname+"/text"+"/"+friendname+"And"+user.getUsername()+".txt";
    QDir dir = QDir::currentPath()+"/"+friendname+"/text";
    qDebug()<<"朋友的聊天文件:"<<friend_textfile;
    QFile myfile(textfile);
    QFile friendfile(friend_textfile);

    // 如果文件已经存在，以续写的方式打开文件
    if (myfile.open(QIODevice::Append)) {
        QTextStream out(&myfile);
        out << data; // 添加新的内容
        myfile.close();

    } else {
        // 无法打开文件
        qDebug()<<"无法打开我的聊天文件";
    }

    // 判断文件是否存在
    if (!friendfile.exists()) {
        // 如果文件不存在，尝试创建文件
        if (friendfile.open(QIODevice::WriteOnly)) {
            QTextStream out(&friendfile);
            out << data; // 写入一些初始内容
            friendfile.close();
        } else {
            // 文件无法打开
            qDebug()<<"无法打开朋友的聊天文件1";
        }
    } else {
        // 如果文件已经存在，以续写的方式打开文件
        if (friendfile.open(QIODevice::Append)) {
            QTextStream out(&friendfile);
            out << data; // 添加新的内容
            friendfile.close();
        } else {
            // 无法打开文件
            qDebug()<<"无法打开朋友的聊天文件2";
        }
    }
    on_pushButton_shuaxin_clicked();
}


//发送文件按钮
void MainWindow::on_pushButton_send_file_clicked()
{
    // 打开文件选择对话框，让用户选择文件
    QString filePath = QFileDialog::getOpenFileName(this, tr("选择文件"), "", tr("所有文件 (*.*)"));

    // 如果用户选择了文件（即文件路径不为空）
    if (!filePath.isEmpty()) {
        // 这里可以执行发送文件的操作，filePath 是用户选择的文件路径
        // 例如，发送文件到服务器、存储文件等操作
        QMessageBox::information(this, tr("文件选择"), tr("选择的文件路径：") + filePath);
    } else {
        // 用户取消了选择
        QMessageBox::information(this, tr("文件选择"), tr("未选择任何文件"));
    }

    QString firendmainpath=QDir::currentPath()+"/"+friendname;
    QString text_path1 = firendmainpath+"/text";
    QString video_path1 = firendmainpath+"/video";
    QString audio_path1 = firendmainpath+"/audio";
    QString image_path1= firendmainpath+"/image";
    QString file_path1 = firendmainpath+"/file";

    qDebug()<<"filePath="<<filePath;
    QFileInfo fileInfo(filePath);
    QString fileName = fileInfo.fileName();  // 获取文件名（不包括路径）
    qDebug()<<"文件名="<<fileName;

    QString friend_textfile=QDir::currentPath()+"/"+friendname+"/text"+"/"+friendname+"And"+user.getUsername()+".txt";

    QFile myfile(textfile);
    QFile friendfile(friend_textfile);
    QFile sourceFile(filePath);

    if(fileName.endsWith(".mp3")){
        //选择的是音频
        qDebug()<<"选择的是音频";
        QString data = "\naudio:"+user.getUsername()+":"+fileName;

        // 如果文件已经存在，以续写的方式打开文件
        if (myfile.open(QIODevice::Append)) {
            QTextStream out(&myfile);
            out << data; // 添加新的内容
            myfile.close();
        } else {
            // 无法打开文件
            qDebug()<<"无法打开我的聊天文件";
        }

        // 判断文件是否存在
        if (!friendfile.exists()) {
            // 如果文件不存在，尝试创建文件
            if (friendfile.open(QIODevice::WriteOnly)) {
                QTextStream out(&friendfile);
                out << data; // 写入一些初始内容
                friendfile.close();
            } else {
                // 文件无法打开
                qDebug()<<"无法打开朋友的聊天文件1";
            }
        } else {
            // 如果文件已经存在，以续写的方式打开文件
            if (friendfile.open(QIODevice::Append)) {
                QTextStream out(&friendfile);
                out << data; // 添加新的内容
                friendfile.close();
            } else {
                // 无法打开文件
                qDebug()<<"无法打开朋友的聊天文件2";
            }
        }

        QFile destinationFile1(audio_path+"/"+fileName);
        QFile destinationFile2(audio_path1+"/"+fileName);

        // 打开源文件进行读取
        if (!sourceFile.open(QIODevice::ReadOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开源文件"));
            return;
        }

        // 读取源文件的全部字节
        QByteArray fileData = sourceFile.readAll();
        sourceFile.close();  // 关闭源文件

        // 打开目标文件1进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile1.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件1"));
            return;
        }

        // 将源文件的内容写入目标文件1
        destinationFile1.write(fileData);
        destinationFile1.close();  // 关闭目标文件1

        // 打开目标文件2进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile2.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件2"));
            return;
        }

        // 将源文件的内容写入目标文件2
        destinationFile2.write(fileData);
        destinationFile2.close();  // 关闭目标文件2
        qDebug()<<data;
    }else if(fileName.endsWith(".mp4")){
        //选择的是视频
        qDebug()<<"选择的是视频";
        QString data = "\nvideo:"+user.getUsername()+":"+fileName;

        // 如果文件已经存在，以续写的方式打开文件
        if (myfile.open(QIODevice::Append)) {
            QTextStream out(&myfile);
            out << data; // 添加新的内容
            myfile.close();
        } else {
            // 无法打开文件
            qDebug()<<"无法打开我的聊天文件";
        }

        // 判断文件是否存在
        if (!friendfile.exists()) {
            // 如果文件不存在，尝试创建文件
            if (friendfile.open(QIODevice::WriteOnly)) {
                QTextStream out(&friendfile);
                out << data; // 写入一些初始内容
                friendfile.close();
            } else {
                // 文件无法打开
                qDebug()<<"无法打开朋友的聊天文件1";
            }
        } else {
            // 如果文件已经存在，以续写的方式打开文件
            if (friendfile.open(QIODevice::Append)) {
                QTextStream out(&friendfile);
                out << data; // 添加新的内容
                friendfile.close();
            } else {
                // 无法打开文件
                qDebug()<<"无法打开朋友的聊天文件2";
            }
        }

        QFile destinationFile1(video_path+"/"+fileName);
        QFile destinationFile2(video_path1+"/"+fileName);

        // 打开源文件进行读取
        if (!sourceFile.open(QIODevice::ReadOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开源文件"));
            return;
        }

        // 读取源文件的全部字节
        QByteArray fileData = sourceFile.readAll();
        sourceFile.close();  // 关闭源文件

        // 打开目标文件1进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile1.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件1"));
            return;
        }

        // 将源文件的内容写入目标文件1
        destinationFile1.write(fileData);
        destinationFile1.close();  // 关闭目标文件1

        // 打开目标文件2进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile2.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件2"));
            return;
        }

        // 将源文件的内容写入目标文件2
        destinationFile2.write(fileData);
        destinationFile2.close();  // 关闭目标文件2
        qDebug()<<data;
    }else if(fileName.endsWith(".jpg")){
        //选择的是图片
        qDebug()<<"选择的是图片";
        QString data = "\nimage:"+user.getUsername()+":"+fileName;

        // 如果文件已经存在，以续写的方式打开文件
        if (myfile.open(QIODevice::Append)) {
            QTextStream out(&myfile);
            out << data; // 添加新的内容
            myfile.close();
        } else {
            // 无法打开文件
            qDebug()<<"无法打开我的聊天文件";
        }

        // 判断文件是否存在
        if (!friendfile.exists()) {
            // 如果文件不存在，尝试创建文件
            if (friendfile.open(QIODevice::WriteOnly)) {
                QTextStream out(&friendfile);
                out << data; // 写入一些初始内容
                friendfile.close();
            } else {
                // 文件无法打开
                qDebug()<<"无法打开朋友的聊天文件1";
            }
        } else {
            // 如果文件已经存在，以续写的方式打开文件
            if (friendfile.open(QIODevice::Append)) {
                QTextStream out(&friendfile);
                out << data; // 添加新的内容
                friendfile.close();
            } else {
                // 无法打开文件
                qDebug()<<"无法打开朋友的聊天文件2";
            }
        }

        QFile destinationFile1(image_path+"/"+fileName);
        QFile destinationFile2(image_path1+"/"+fileName);

        // 打开源文件进行读取
        if (!sourceFile.open(QIODevice::ReadOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开源文件"));
            return;
        }

        // 读取源文件的全部字节
        QByteArray fileData = sourceFile.readAll();
        sourceFile.close();  // 关闭源文件

        // 打开目标文件1进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile1.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件1"));
            return;
        }

        // 将源文件的内容写入目标文件1
        destinationFile1.write(fileData);
        destinationFile1.close();  // 关闭目标文件1

        // 打开目标文件2进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile2.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件2"));
            return;
        }

        // 将源文件的内容写入目标文件2
        destinationFile2.write(fileData);
        destinationFile2.close();  // 关闭目标文件2
        qDebug()<<data;
    }else{
        //选择的是其他文件
        qDebug()<<"选择的是其他文件";
        QString data = "\nfile:"+user.getUsername()+":"+fileName;

        // 如果文件已经存在，以续写的方式打开文件
        if (myfile.open(QIODevice::Append)) {
            QTextStream out(&myfile);
            out << data; // 添加新的内容
            myfile.close();
        } else {
            // 无法打开文件
            qDebug()<<"无法打开我的聊天文件";
        }

        // 判断文件是否存在
        if (!friendfile.exists()) {
            // 如果文件不存在，尝试创建文件
            if (friendfile.open(QIODevice::WriteOnly)) {
                QTextStream out(&friendfile);
                out << data; // 写入一些初始内容
                friendfile.close();
            } else {
                // 文件无法打开
                qDebug()<<"无法打开朋友的聊天文件1";
            }
        } else {
            // 如果文件已经存在，以续写的方式打开文件
            if (friendfile.open(QIODevice::Append)) {
                QTextStream out(&friendfile);
                out << data; // 添加新的内容
                friendfile.close();
            } else {
                // 无法打开文件
                qDebug()<<"无法打开朋友的聊天文件2";
            }
        }

        QFile destinationFile1(file_path+"/"+fileName);
        QFile destinationFile2(file_path1+"/"+fileName);

        // 打开源文件进行读取
        if (!sourceFile.open(QIODevice::ReadOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开源文件"));
            return;
        }

        // 读取源文件的全部字节
        QByteArray fileData = sourceFile.readAll();
        sourceFile.close();  // 关闭源文件

        // 打开目标文件1进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile1.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件1"));
            return;
        }

        // 将源文件的内容写入目标文件1
        destinationFile1.write(fileData);
        destinationFile1.close();  // 关闭目标文件1

        // 打开目标文件2进行写入，如果目标文件不存在，将会自动创建
        if (!destinationFile2.open(QIODevice::WriteOnly)) {
            QMessageBox::warning(this, tr("错误"), tr("无法打开目标文件2"));
            return;
        }

        // 将源文件的内容写入目标文件2
        destinationFile2.write(fileData);
        destinationFile2.close();  // 关闭目标文件2
    }
}

